/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/include/agvNavigate/opInclude/operation_waitfor_release.h
 * @Description  : 定义了OperationWaitForRelease类，用于处理等待放行操作的逻辑。
 *                 包含了初始化、准备、开始、结束和运行操作的相关方法，
 *                 以及获取按钮释放信号、查找延迟释放参数和设置绿灯闪烁的功能。
 *                 该类还包含了输入IO点的定义和相关的ROS节点句柄及服务客户端。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 16:39:54
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/ 
#pragma once
#include "operation.h"
#include <agv_msgs/msg/read_in_puts_new.hpp>
#include <std_srvs/srv/trigger.hpp>
#include "timestamp.h"
#define WAIT_ACTION_TYPE "waitForRelease" // 等待放行动作类型
#define RELEASE_BUTTON_BIT 13             // 放行按钮64位中的第十三位(根据io模块顺序表定义)
//////////////////////////////////////////////////////////////////////////////
//   The interface of class "Operation".
class OperationWaitForRelease : public Operation
{

 public:
    // 定义输入IO点类型
    using INPUT_IO_TYPE = DataTimeStamp<agv_msgs::msg::PairTypeInt>;

    // 构造函数
    explicit OperationWaitForRelease(const agv_msgs::msg::Action& action);

    // 析构函数
    virtual ~OperationWaitForRelease() = default;

    // 初始化相关数据
    virtual bool Init() override;

    // 准备开始操作
    virtual bool ReadyStart() override;

    // 定义如何开始操作
    virtual bool StartAction() override;

    // 定义如何结束操作
    virtual bool EndAction() override;

    // 定义如何运行操作
    virtual bool Work() override;

 private:
    // 获取按钮释放信号
    bool GetButtonRelease();

    // 查找延迟释放参数
    bool FindTimeDelayRelease();

    // 设置绿灯闪烁
    bool SetGreenBlink();

    // 更新输入IO对象
    bool UpdateInutIoNew(const agv_msgs::msg::ReadInPutsNew &msg, INPUT_IO_TYPE &io);

 private:
    // 设置绿灯闪烁-通知放行按钮按下
    rclcpp::Client<std_srvs::srv::Trigger>::SharedPtr client_green_blink_;

    // 放行按钮在IO输入列表的位置 放行按钮
    INPUT_IO_TYPE release_button_;

    // 长按释放按钮计数(过滤使用)
    int pressed_count_;

    // 延迟释放的秒数
    int time_delay_release_;

    // 定时器触发一次
    TimerTriggerOnce trigger_once_;
};
